suppressMessages(suppressWarnings({
library(magrittr, quietly = TRUE)
library(tibble, quietly = TRUE)
library(dplyr, quietly = TRUE)
#library(Matrix, quietly = TRUE)
#library(qgraph, quietly = TRUE)
#library(psych, quietly = TRUE)
#library(corpcor, quietly = TRUE)
#library(corrplot, quietly = TRUE)
library(knitr, quietly = TRUE)
}))
source('plotting_functions.R')
source('../get_cor_genes.R')
opts_chunk$set(
dev = c("png", "pdf"),
dpi = 150
#,
#fig.width = 8/2.54, fig.height = 8/2.54
)
Get data
require(SummarizedExperiment)
require(magrittr)
#
#
# Join Rdata files to singe SummarizedExperiment class
#setwd('/Users/nataliabulgakova/Documents/R/RNAseq')
dir('../data', full.names = TRUE, pattern = 'Rdata') %>% sapply(function(x) get(load(x)) ) -> SE_list
SE <- do.call(cbind, SE_list)
colnames(SE) <- gsub('(SRR[0-9]+)\\.bam', '\\1', colnames(SE))
Hi correlations with given gene
library(org.Hs.eg.db)
require(DESeq2)
sig <- getHiCor(SE, SYMBOL='CDH1', rpkm='TRUE', cor_cutoff=0.7, anticor_cutoff=-0.6)
sig
Correlations
library(psych, quietly = TRUE)
M <- t(fpkm(DESeqDataSet(SE, ~1), robust = TRUE)[sig$entrez,])
R <- cor(M)
rownames(R) <- sig$SYMBOL
colnames(R) <- sig$SYMBOL
P <- corr.p(R, nrow(assay(SE)), adjust="fdr")$p
if(!all( R[lower.tri(R)] == t(R)[lower.tri(R)] )) stop('Matrix R is not symetric!')
P[lower.tri(P)] <- t(P)[lower.tri(P)]
Plot
library(corrplot, quietly = TRUE)
corrplot(
R, order = "AOE", type = 'lower', diag=T,
method = 'number', tl.pos = 'lt', p.mat=P, sig.level=0.05
)
corrplot(
R, order = "AOE", type = 'upper',diag=F,
add = TRUE, method = 'circle', tl.pos = 'n', p.mat=P, insig = "p-value", sig.level=0.05
)

Speraman correlation coeficiemnt
knitr::kable(R, "html", table.attr = 'class="table table-condensed corrtable"', digits =2, padding = 1)
|
|
CDH1
|
ESRP2
|
MARVELD3
|
TSPAN13
|
EPCAM
|
GRHL2
|
SNRPD3
|
TJP3
|
NECTIN4
|
ARHGEF16
|
LAD1
|
SPINT1
|
TMEM141
|
SPRR2A
|
SH3YL1
|
PEX13
|
TMPRSS4
|
TRAF4
|
DHRS13
|
MISP
|
LIX1L
|
CCDC88A
|
CD99L2
|
|
CDH1
|
1.00
|
0.88
|
0.87
|
0.77
|
0.75
|
0.74
|
0.73
|
0.73
|
0.72
|
0.72
|
0.71
|
0.71
|
0.71
|
0.71
|
0.71
|
0.71
|
0.70
|
0.70
|
0.70
|
0.70
|
-0.65
|
-0.61
|
-0.60
|
|
ESRP2
|
0.88
|
1.00
|
0.83
|
0.68
|
0.73
|
0.84
|
0.58
|
0.75
|
0.73
|
0.81
|
0.62
|
0.79
|
0.65
|
0.50
|
0.68
|
0.57
|
0.52
|
0.72
|
0.56
|
0.69
|
-0.70
|
-0.61
|
-0.64
|
|
MARVELD3
|
0.87
|
0.83
|
1.00
|
0.77
|
0.71
|
0.75
|
0.69
|
0.62
|
0.80
|
0.75
|
0.85
|
0.73
|
0.70
|
0.70
|
0.78
|
0.59
|
0.71
|
0.67
|
0.67
|
0.55
|
-0.65
|
-0.63
|
-0.64
|
|
TSPAN13
|
0.77
|
0.68
|
0.77
|
1.00
|
0.59
|
0.46
|
0.66
|
0.56
|
0.76
|
0.64
|
0.70
|
0.48
|
0.72
|
0.80
|
0.69
|
0.72
|
0.69
|
0.60
|
0.70
|
0.50
|
-0.34
|
-0.29
|
-0.40
|
|
EPCAM
|
0.75
|
0.73
|
0.71
|
0.59
|
1.00
|
0.56
|
0.45
|
0.67
|
0.59
|
0.79
|
0.42
|
0.60
|
0.64
|
0.64
|
0.62
|
0.69
|
0.65
|
0.49
|
0.59
|
0.68
|
-0.58
|
-0.56
|
-0.60
|
|
GRHL2
|
0.74
|
0.84
|
0.75
|
0.46
|
0.56
|
1.00
|
0.45
|
0.54
|
0.66
|
0.60
|
0.62
|
0.69
|
0.37
|
0.37
|
0.68
|
0.35
|
0.42
|
0.51
|
0.37
|
0.43
|
-0.71
|
-0.65
|
-0.60
|
|
SNRPD3
|
0.73
|
0.58
|
0.69
|
0.66
|
0.45
|
0.45
|
1.00
|
0.40
|
0.53
|
0.43
|
0.64
|
0.48
|
0.65
|
0.54
|
0.42
|
0.57
|
0.52
|
0.47
|
0.62
|
0.41
|
-0.33
|
-0.44
|
-0.48
|
|
TJP3
|
0.73
|
0.75
|
0.62
|
0.56
|
0.67
|
0.54
|
0.40
|
1.00
|
0.69
|
0.74
|
0.44
|
0.63
|
0.58
|
0.57
|
0.59
|
0.54
|
0.62
|
0.70
|
0.56
|
0.75
|
-0.47
|
-0.50
|
-0.47
|
|
NECTIN4
|
0.72
|
0.73
|
0.80
|
0.76
|
0.59
|
0.66
|
0.53
|
0.69
|
1.00
|
0.68
|
0.79
|
0.60
|
0.73
|
0.79
|
0.78
|
0.64
|
0.78
|
0.61
|
0.67
|
0.46
|
-0.42
|
-0.48
|
-0.45
|
|
ARHGEF16
|
0.72
|
0.81
|
0.75
|
0.64
|
0.79
|
0.60
|
0.43
|
0.74
|
0.68
|
1.00
|
0.56
|
0.77
|
0.73
|
0.59
|
0.61
|
0.50
|
0.65
|
0.75
|
0.63
|
0.74
|
-0.61
|
-0.50
|
-0.55
|
|
LAD1
|
0.71
|
0.62
|
0.85
|
0.70
|
0.42
|
0.62
|
0.64
|
0.44
|
0.79
|
0.56
|
1.00
|
0.52
|
0.67
|
0.74
|
0.77
|
0.52
|
0.71
|
0.57
|
0.68
|
0.37
|
-0.48
|
-0.47
|
-0.47
|
|
SPINT1
|
0.71
|
0.79
|
0.73
|
0.48
|
0.60
|
0.69
|
0.48
|
0.63
|
0.60
|
0.77
|
0.52
|
1.00
|
0.60
|
0.32
|
0.47
|
0.35
|
0.49
|
0.65
|
0.54
|
0.64
|
-0.63
|
-0.64
|
-0.62
|
|
TMEM141
|
0.71
|
0.65
|
0.70
|
0.72
|
0.64
|
0.37
|
0.65
|
0.58
|
0.73
|
0.73
|
0.67
|
0.60
|
1.00
|
0.76
|
0.58
|
0.69
|
0.72
|
0.62
|
0.79
|
0.64
|
-0.27
|
-0.43
|
-0.41
|
|
SPRR2A
|
0.71
|
0.50
|
0.70
|
0.80
|
0.64
|
0.37
|
0.54
|
0.57
|
0.79
|
0.59
|
0.74
|
0.32
|
0.76
|
1.00
|
0.78
|
0.82
|
0.91
|
0.50
|
0.75
|
0.46
|
-0.28
|
-0.33
|
-0.32
|
|
SH3YL1
|
0.71
|
0.68
|
0.78
|
0.69
|
0.62
|
0.68
|
0.42
|
0.59
|
0.78
|
0.61
|
0.77
|
0.47
|
0.58
|
0.78
|
1.00
|
0.65
|
0.66
|
0.38
|
0.47
|
0.39
|
-0.56
|
-0.47
|
-0.52
|
|
PEX13
|
0.71
|
0.57
|
0.59
|
0.72
|
0.69
|
0.35
|
0.57
|
0.54
|
0.64
|
0.50
|
0.52
|
0.35
|
0.69
|
0.82
|
0.65
|
1.00
|
0.77
|
0.40
|
0.62
|
0.49
|
-0.31
|
-0.38
|
-0.42
|
|
TMPRSS4
|
0.70
|
0.52
|
0.71
|
0.69
|
0.65
|
0.42
|
0.52
|
0.62
|
0.78
|
0.65
|
0.71
|
0.49
|
0.72
|
0.91
|
0.66
|
0.77
|
1.00
|
0.61
|
0.81
|
0.52
|
-0.33
|
-0.43
|
-0.40
|
|
TRAF4
|
0.70
|
0.72
|
0.67
|
0.60
|
0.49
|
0.51
|
0.47
|
0.70
|
0.61
|
0.75
|
0.57
|
0.65
|
0.62
|
0.50
|
0.38
|
0.40
|
0.61
|
1.00
|
0.71
|
0.69
|
-0.44
|
-0.41
|
-0.50
|
|
DHRS13
|
0.70
|
0.56
|
0.67
|
0.70
|
0.59
|
0.37
|
0.62
|
0.56
|
0.67
|
0.63
|
0.68
|
0.54
|
0.79
|
0.75
|
0.47
|
0.62
|
0.81
|
0.71
|
1.00
|
0.52
|
-0.26
|
-0.33
|
-0.36
|
|
MISP
|
0.70
|
0.69
|
0.55
|
0.50
|
0.68
|
0.43
|
0.41
|
0.75
|
0.46
|
0.74
|
0.37
|
0.64
|
0.64
|
0.46
|
0.39
|
0.49
|
0.52
|
0.69
|
0.52
|
1.00
|
-0.48
|
-0.58
|
-0.50
|
|
LIX1L
|
-0.65
|
-0.70
|
-0.65
|
-0.34
|
-0.58
|
-0.71
|
-0.33
|
-0.47
|
-0.42
|
-0.61
|
-0.48
|
-0.63
|
-0.27
|
-0.28
|
-0.56
|
-0.31
|
-0.33
|
-0.44
|
-0.26
|
-0.48
|
1.00
|
0.60
|
0.64
|
|
CCDC88A
|
-0.61
|
-0.61
|
-0.63
|
-0.29
|
-0.56
|
-0.65
|
-0.44
|
-0.50
|
-0.48
|
-0.50
|
-0.47
|
-0.64
|
-0.43
|
-0.33
|
-0.47
|
-0.38
|
-0.43
|
-0.41
|
-0.33
|
-0.58
|
0.60
|
1.00
|
0.59
|
|
CD99L2
|
-0.60
|
-0.64
|
-0.64
|
-0.40
|
-0.60
|
-0.60
|
-0.48
|
-0.47
|
-0.45
|
-0.55
|
-0.47
|
-0.62
|
-0.41
|
-0.32
|
-0.52
|
-0.42
|
-0.40
|
-0.50
|
-0.36
|
-0.50
|
0.64
|
0.59
|
1.00
|
Cor test p-val
knitr::kable(P, "html", table.attr = 'class="table table-condensed corrtable"', digits =2, padding = 1)
|
|
CDH1
|
ESRP2
|
MARVELD3
|
TSPAN13
|
EPCAM
|
GRHL2
|
SNRPD3
|
TJP3
|
NECTIN4
|
ARHGEF16
|
LAD1
|
SPINT1
|
TMEM141
|
SPRR2A
|
SH3YL1
|
PEX13
|
TMPRSS4
|
TRAF4
|
DHRS13
|
MISP
|
LIX1L
|
CCDC88A
|
CD99L2
|
|
CDH1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
ESRP2
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
MARVELD3
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
TSPAN13
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
EPCAM
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
GRHL2
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
SNRPD3
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
TJP3
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
NECTIN4
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
ARHGEF16
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
LAD1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
SPINT1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
TMEM141
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
SPRR2A
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
SH3YL1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
PEX13
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
TMPRSS4
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
TRAF4
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
DHRS13
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
MISP
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
LIX1L
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
CCDC88A
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
|
CD99L2
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
Speraman correlation network - spring layout
Significant correlations
library(qgraph, quietly = TRUE)
r <- R
r[P > 0.05] <- NA
diag(r) <- NA
z <- qgraph(r, layout = "spring", title = 'Speraman correlation network - significant correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
plot(z)

All correlations
z <- qgraph(R, layout = "spring", title = 'Speraman correlation network - all correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
plot(z)

Speraman correlation network - circle layout
Significant correlations
z <- qgraph(r, layout = "circle", title = 'Speraman correlation network - significant correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
plot(z)

All correlations
z <- qgraph(R, layout = "circle", title = 'Speraman correlation network - all correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
plot(z)

Speraman correlation network - with LASSO
#Needed only if cor(M) is no PD
#colnames(M) <- sig$SYMBOL
#MM <- collapsemaxcor(M, method = 'pearson')
#while(!attr(MM, 'PD')) {
# MM <- collapsemaxcor(MM, method = 'pearson')
#}
Significant correlations
r <- cor(M)
p <- corr.p(r, 20000, adjust = 'none')
r[p$p > 0.05] <- 0 #
EBICgraph <- EBICglasso(r, 20000, 0.5)
z <- qgraph(EBICgraph, layout = "spring", title = 'Speraman correlation network - significant correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
plot(z)

All correlations
r <- cor(M)
EBICgraph <- EBICglasso(r, 20000, 0.5)
Network with lowest lambda selected as best network. Try setting 'lambda.min.ratio' lower.
z <- qgraph(EBICgraph, layout = "spring", title = 'Speraman correlation network - all correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
plot(z)

LS0tCnRpdGxlOiAiSW50ZXJhY3Rpb24gbmV0d29ya3Mgd2l0aCBzaWduaWZpY2FuY2UgdGVzdGluZyIKYXV0aG9yOiAiUHJ6ZW15c2xhdyBBbGVrc2FuZGVyIFN0ZW1wb3IiCmRhdGU6ICdgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkICVCICVZIilgJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2hlaWdodDogMTAKICAgIGZpZ19yZXRpbmE6IDEKICAgIGZpZ193aWR0aDogMTAKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpgYGB7cn0Kc3VwcHJlc3NNZXNzYWdlcyhzdXBwcmVzc1dhcm5pbmdzKHsKICBsaWJyYXJ5KG1hZ3JpdHRyLCBxdWlldGx5ID0gVFJVRSkKICBsaWJyYXJ5KHRpYmJsZSwgcXVpZXRseSA9IFRSVUUpCiAgbGlicmFyeShkcGx5ciwgcXVpZXRseSA9IFRSVUUpCiAgI2xpYnJhcnkoTWF0cml4LCBxdWlldGx5ID0gVFJVRSkKICAjbGlicmFyeShxZ3JhcGgsIHF1aWV0bHkgPSBUUlVFKQogICNsaWJyYXJ5KHBzeWNoLCBxdWlldGx5ID0gVFJVRSkKICAjbGlicmFyeShjb3JwY29yLCBxdWlldGx5ID0gVFJVRSkKICAjbGlicmFyeShjb3JycGxvdCwgcXVpZXRseSA9IFRSVUUpCiAgbGlicmFyeShrbml0ciwgcXVpZXRseSA9IFRSVUUpCn0pKQpzb3VyY2UoJ3Bsb3R0aW5nX2Z1bmN0aW9ucy5SJykKc291cmNlKCcuLi9nZXRfY29yX2dlbmVzLlInKQpvcHRzX2NodW5rJHNldCgKICBkZXYgPSBjKCJwbmciLCAicGRmIiksIAogIGRwaSA9IDE1MAogICMsCiAgI2ZpZy53aWR0aCA9IDgvMi41NCwgZmlnLmhlaWdodCA9IDgvMi41NAopCgpgYGAKCgo8c3R5bGU+CiAgdGFibGUuY29ycnRhYmxlIHRkOm50aC1jaGlsZCgxKXsKICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgfQogIGJvZHkgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWFyZ2luOiBhdXRvOwogICAgcGFkZGluZzogMWVtOwogICAgbGluZS1oZWlnaHQ6IDIwcHggOyAKICB9IAogIGRpdi5tYWluLWNvbnRhaW5lciB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQo8L3N0eWxlPgoKCiMgR2V0IGRhdGEgCgpgYGB7cn0KcmVxdWlyZShTdW1tYXJpemVkRXhwZXJpbWVudCkKcmVxdWlyZShtYWdyaXR0cikKIwoKIwoKCiMgSm9pbiBSZGF0YSBmaWxlcyB0byBzaW5nZSBTdW1tYXJpemVkRXhwZXJpbWVudCBjbGFzcwojc2V0d2QoJy9Vc2Vycy9uYXRhbGlhYnVsZ2Frb3ZhL0RvY3VtZW50cy9SL1JOQXNlcScpCmRpcignLi4vZGF0YScsIGZ1bGwubmFtZXMgPSBUUlVFLCBwYXR0ZXJuID0gJ1JkYXRhJykgJT4lIHNhcHBseShmdW5jdGlvbih4KSBnZXQobG9hZCh4KSkgKSAtPiBTRV9saXN0ClNFIDwtIGRvLmNhbGwoY2JpbmQsIFNFX2xpc3QpCmNvbG5hbWVzKFNFKSA8LSBnc3ViKCcoU1JSWzAtOV0rKVxcLmJhbScsICdcXDEnLCBjb2xuYW1lcyhTRSkpCmBgYAoKCiMgSGkgY29ycmVsYXRpb25zIHdpdGggZ2l2ZW4gZ2VuZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShvcmcuSHMuZWcuZGIpCnJlcXVpcmUoREVTZXEyKQoKc2lnIDwtIGdldEhpQ29yKFNFLCBTWU1CT0w9J0NESDEnLCBycGttPSdUUlVFJywgY29yX2N1dG9mZj0wLjcsIGFudGljb3JfY3V0b2ZmPS0wLjYpCnNpZwoKYGBgCgoKIyBDb3JyZWxhdGlvbnMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgoKYGBge3J9CmxpYnJhcnkocHN5Y2gsIHF1aWV0bHkgPSBUUlVFKQoKTSA8LSB0KGZwa20oREVTZXFEYXRhU2V0KFNFLCB+MSksIHJvYnVzdCA9IFRSVUUpW3NpZyRlbnRyZXosXSkKClIgPC0gY29yKE0pCnJvd25hbWVzKFIpIDwtIHNpZyRTWU1CT0wKY29sbmFtZXMoUikgPC0gc2lnJFNZTUJPTAoKUCAgPC0gY29yci5wKFIsIG5yb3coYXNzYXkoU0UpKSwgYWRqdXN0PSJmZHIiKSRwCgppZighYWxsKCBSW2xvd2VyLnRyaShSKV0gPT0gdChSKVtsb3dlci50cmkoUildICkpIHN0b3AoJ01hdHJpeCBSIGlzIG5vdCBzeW1ldHJpYyEnKQpQW2xvd2VyLnRyaShQKV0gPC0gdChQKVtsb3dlci50cmkoUCldCgoKYGBgCgojIyBQbG90CgpgYGB7ciwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9Nn0KbGlicmFyeShjb3JycGxvdCwgcXVpZXRseSA9IFRSVUUpCgpjb3JycGxvdCgKICBSLCBvcmRlciA9ICJBT0UiLCB0eXBlID0gJ2xvd2VyJywgZGlhZz1ULCAKICBtZXRob2QgPSAnbnVtYmVyJywgdGwucG9zID0gJ2x0JywgcC5tYXQ9UCwgc2lnLmxldmVsPTAuMDUKKQpjb3JycGxvdCgKICBSLCBvcmRlciA9ICJBT0UiLCB0eXBlID0gJ3VwcGVyJyxkaWFnPUYsIAogIGFkZCA9IFRSVUUsIG1ldGhvZCA9ICdjaXJjbGUnLCB0bC5wb3MgPSAnbicsIHAubWF0PVAsIGluc2lnID0gInAtdmFsdWUiLCBzaWcubGV2ZWw9MC4wNQopCmBgYAoKIyMgU3BlcmFtYW4gY29ycmVsYXRpb24gY29lZmljaWVtbnQKYGBge3J9CmtuaXRyOjprYWJsZShSLCAiaHRtbCIsIHRhYmxlLmF0dHIgPSAnY2xhc3M9InRhYmxlIHRhYmxlLWNvbmRlbnNlZCBjb3JydGFibGUiJywgZGlnaXRzID0yLCBwYWRkaW5nID0gMSkKYGBgCgojIyBDb3IgdGVzdCBwLXZhbApgYGB7cn0Ka25pdHI6OmthYmxlKFAsICJodG1sIiwgdGFibGUuYXR0ciA9ICdjbGFzcz0idGFibGUgdGFibGUtY29uZGVuc2VkIGNvcnJ0YWJsZSInLCBkaWdpdHMgPTIsIHBhZGRpbmcgPSAxKQpgYGAKCgoKIyBTcGVyYW1hbiBjb3JyZWxhdGlvbiBuZXR3b3JrIC0gc3ByaW5nIGxheW91dCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIFNpZ25pZmljYW50IGNvcnJlbGF0aW9ucwpgYGB7ciwgd2FybmluZz1GQUxTRX0KbGlicmFyeShxZ3JhcGgsIHF1aWV0bHkgPSBUUlVFKQogIHIgPC0gUgogIHJbUCA+IDAuMDVdIDwtIE5BIAogIGRpYWcocikgPC0gTkEKICB6IDwtIHFncmFwaChyLCBsYXlvdXQgPSAic3ByaW5nIiwgdGl0bGUgPSAnU3BlcmFtYW4gY29ycmVsYXRpb24gbmV0d29yayAtIHNpZ25pZmljYW50IGNvcnJlbGF0aW9ucycsIERvTm90UGxvdD1UUlVFLCBkaXJlY3RlZD1GQUxTRSwgYmlkaXJlY3Rpb25hbD1UUlVFKQogIHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscyA8LSBuYW1lcyh6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMpCiAgcGxvdCh6KQpgYGAKCiMjIEFsbCBjb3JyZWxhdGlvbnMKYGBge3J9CgogIHogPC0gcWdyYXBoKFIsIGxheW91dCA9ICJzcHJpbmciLCB0aXRsZSA9ICdTcGVyYW1hbiBjb3JyZWxhdGlvbiBuZXR3b3JrIC0gYWxsIGNvcnJlbGF0aW9ucycsIERvTm90UGxvdD1UUlVFLCBkaXJlY3RlZD1GQUxTRSwgYmlkaXJlY3Rpb25hbD1UUlVFKQogIHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscyA8LSBuYW1lcyh6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMpCiAgcGxvdCh6KQpgYGAKCgoKIyBTcGVyYW1hbiBjb3JyZWxhdGlvbiBuZXR3b3JrIC0gY2lyY2xlIGxheW91dCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIFNpZ25pZmljYW50IGNvcnJlbGF0aW9ucwpgYGB7ciwgd2FybmluZz1GQUxTRX0KICB6IDwtIHFncmFwaChyLCBsYXlvdXQgPSAiY2lyY2xlIiwgdGl0bGUgPSAnU3BlcmFtYW4gY29ycmVsYXRpb24gbmV0d29yayAtIHNpZ25pZmljYW50IGNvcnJlbGF0aW9ucycsIERvTm90UGxvdD1UUlVFLCBkaXJlY3RlZD1GQUxTRSwgYmlkaXJlY3Rpb25hbD1UUlVFKQogIHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscyA8LSBuYW1lcyh6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMpCiAgcGxvdCh6KQpgYGAKCiMjIEFsbCBjb3JyZWxhdGlvbnMKYGBge3J9CiAgeiA8LSBxZ3JhcGgoUiwgbGF5b3V0ID0gImNpcmNsZSIsIHRpdGxlID0gJ1NwZXJhbWFuIGNvcnJlbGF0aW9uIG5ldHdvcmsgLSBhbGwgY29ycmVsYXRpb25zJywgRG9Ob3RQbG90PVRSVUUsIGRpcmVjdGVkPUZBTFNFLCBiaWRpcmVjdGlvbmFsPVRSVUUpCiAgeiRncmFwaEF0dHJpYnV0ZXMkTm9kZXMkbGFiZWxzIDwtIG5hbWVzKHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscykKICBwbG90KHopCmBgYAoKCgojIFNwZXJhbWFuIGNvcnJlbGF0aW9uIG5ldHdvcmsgLSB3aXRoIExBU1NPIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CgogICNOZWVkZWQgb25seSBpZiBjb3IoTSkgaXMgbm8gUEQKICAjY29sbmFtZXMoTSkgPC0gc2lnJFNZTUJPTAogICNNTSA8LSBjb2xsYXBzZW1heGNvcihNLCBtZXRob2QgPSAncGVhcnNvbicpCiAgI3doaWxlKCFhdHRyKE1NLCAnUEQnKSkgewogICMgIE1NIDwtIGNvbGxhcHNlbWF4Y29yKE1NLCBtZXRob2QgPSAncGVhcnNvbicpCiAgI30KCiAgCmBgYAoKIyMgU2lnbmlmaWNhbnQgY29ycmVsYXRpb25zCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQogIHIgPC0gY29yKE0pCiAgcCA8LSBjb3JyLnAociwgMjAwMDAsIGFkanVzdCA9ICdub25lJykKCiAgcltwJHAgPiAwLjA1XSA8LSAwICMKICBFQklDZ3JhcGggPC0gRUJJQ2dsYXNzbyhyLCAyMDAwMCwgMC41KQogIHogPC0gcWdyYXBoKEVCSUNncmFwaCwgbGF5b3V0ID0gInNwcmluZyIsIHRpdGxlID0gJ1NwZXJhbWFuIGNvcnJlbGF0aW9uIG5ldHdvcmsgLSBzaWduaWZpY2FudCBjb3JyZWxhdGlvbnMnLCBEb05vdFBsb3Q9VFJVRSwgZGlyZWN0ZWQ9RkFMU0UsIGJpZGlyZWN0aW9uYWw9VFJVRSkKICB6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMgPC0gbmFtZXMoeiRncmFwaEF0dHJpYnV0ZXMkTm9kZXMkbGFiZWxzKQogIHBsb3QoeikKYGBgCgojIyBBbGwgY29ycmVsYXRpb25zCmBgYHtyfQogIHIgPC0gY29yKE0pCiAgRUJJQ2dyYXBoIDwtIEVCSUNnbGFzc28ociwgMjAwMDAsIDAuNSkKICB6IDwtIHFncmFwaChFQklDZ3JhcGgsIGxheW91dCA9ICJzcHJpbmciLCB0aXRsZSA9ICdTcGVyYW1hbiBjb3JyZWxhdGlvbiBuZXR3b3JrIC0gYWxsIGNvcnJlbGF0aW9ucycsIERvTm90UGxvdD1UUlVFLCBkaXJlY3RlZD1GQUxTRSwgYmlkaXJlY3Rpb25hbD1UUlVFKQogIHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscyA8LSBuYW1lcyh6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMpCiAgcGxvdCh6KQpgYGAKCgo=